package com.example.redislearn.example.distributed_locks;

import lombok.extern.slf4j.Slf4j;
import org.redisson.Redisson;
import org.redisson.api.RLock;
import org.springframework.stereotype.Component;

import javax.annotation.Resource;
import java.util.concurrent.TimeUnit;

@Component
@Slf4j
public class RedissonDistributedLock {
    @Resource
    private Redisson redisson;

    public void lockExamples() throws InterruptedException {
        RLock lock = redisson.getLock("lock");
        //Redisson内部提供了一个监控锁的看门狗，它的作用是在Redisson实例被关闭前，不断的延长锁的有效期。
        // 默认情况下，看门狗的检查锁的超时时间是30秒钟，也可以通过修改Config.lockWatchdogTimeout来另行指定。
        // 加锁以后10秒钟自动解锁
        // 无需调用unlock方法手动解锁
        // lock.lock(10, TimeUnit.SECONDS);
        // 尝试加锁，最多等待10秒，上锁以后10秒自动解锁
        boolean res = lock.tryLock(10, 10, TimeUnit.SECONDS);
        if (res) {
            try {
                // 模拟其他线程访问
                OtherThread(lock);
                log.info(Thread.currentThread().getName() + "主线程获取到锁，进行操作");
                TimeUnit.SECONDS.sleep(10);
            } finally {
                lock.unlock();
            }
        }

        TimeUnit.SECONDS.sleep(1);

    }

    private void OtherThread(RLock lock) {
        Thread thread = new Thread(() -> {
            RLock lock1 = redisson.getLock("lock");
            try {
                boolean res1 = lock1.tryLock(10, 10, TimeUnit.SECONDS);
                if (res1) {
                    log.info("其他线程获取到锁，进行操作");
                }else{
                    log.info("其他线程未获取到锁");
                }
            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                lock.unlock();
            }

        });
        thread.start();
    }
}
